package gps;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.w3c.dom.ranges.RangeException;

// @author Nuno, Fabio, Manel
public class GPS 
{
    String eq;
    int iteracao;

    GPS(){
        
    }
    
    public void setString(String st)
    {
        eq=st;
    }
    public String getString()
    {
        return eq;
    }
   
    public String evidenciaIncognita(String equacao, String incog){     // se o "x" estiver no segundo membro não funciona(não previsto)
        String aux = new String();
        String coefx = new String();
        String nova_eq;    //equação com o x em evidencia
        int i=0,membro = 0,j;
        nova_eq=incog+"=";
        try{
            while(i<equacao.length()){      //ciclo para percorrer a string "equacao"
                if((""+equacao.charAt(i)).contains(incog)){        //verifica se estamos perante o "x" que queremos ter em evidencia
                    i--;
                    while(equacao.charAt(i)>=48 && equacao.charAt(i)<=57&&i>0)   //ciclo para encontrar o primeiro número do coeficiente do x
                        i--;
                    if((""+equacao.charAt(i)).equals("+"))
                        i++;
                    while(!(""+equacao.charAt(i)).equals(incog)){          //ciclo para guardar o coeficiente do x para mais tarde dividirmos no outro membro
                        coefx=coefx+equacao.charAt(i);
                        i++;
                    }
                    i++; 
                }
                if(("=".contains(""+equacao.charAt(i)))){       //verifica se estamos perante o "=", significa que vamos mudar de membro
                    membro=1;
                }
                if(("+".contains(""+equacao.charAt(i)))){       //verifica se estamos perante o sinal "+"
                    if(membro==0){
                        aux=aux+"-";        //  se estivermos no 1 membro, então o numero vai ter de passar ao seu simetrico
                        i++;
                    }
                    else{
                        aux=aux+"+";        //  senão, fica com o mesmo sinal
                        i++;
                    }
                }
                if(("-".contains(""+equacao.charAt(i)))){       //verifica se estamos perante o sinal "-"
                    if(membro==0){      //  se estivermos no 1 membro, então o numero vai ter de passar ao seu simetrico
                        aux=aux+"+";        
                        i++;
                    }
                    else{
                        aux=aux+"-";        //  senão, fica com o mesmo sinal
                        i++;
                    }                
                }
                if(equacao.charAt(i)>=48 && equacao.charAt(i)<=57){         //verifica se estamos perante um numero entre "0" e "9"
                    j=0;
                    while(equacao.charAt(i)>=48 && equacao.charAt(i)<=57&&i<equacao.length()-1){    //verificamos se o numero em questao é o coeficiente
                        i++;
                        j++;
                    }
                    if(!(""+equacao.charAt(i)).equals(incog)){     //se não for
                        while(j>0){     //temos de voltar para o mesmo sitio onde estavamos
                            i--;
                            j--;
                        }
                        while(i<=equacao.length()-1&&(equacao.charAt(i)=='w'||equacao.charAt(i)=='x'||equacao.charAt(i)=='z'||equacao.charAt(i)=='y'||equacao.charAt(i)>=48 && equacao.charAt(i)<=57)){ 
                            if(aux.isEmpty()){              //ciclo para preencher a variavel aux com os numeros dos coeficientes
                                if(membro==0)               //o ciclo acaba se não for um número ou uma letra e se chegarmos ao fim da equacao
                                    aux="-";
                                else aux="+";
                            }
                            aux=aux+equacao.charAt(i);
                            i++;

                        }
                        i--;
                    }else{      //se for o coeficiente de "x" temos de voltar onde estavamos e dizer que não vamos alterar a equacao final
                        aux="";
                        while(j>0){
                            i--;
                            j--;
                        }
                    }
                }  
                nova_eq=nova_eq+aux;           //onde é preenchida a string com a equacao final
                aux="";         //faz reset a variavel aux para ser preenchida novamente na próxima iteracao
                i++;
            }
        }catch(IndexOutOfBoundsException e){System.out.println("Verifique se o x está no primeiro membro"); }
        if(!coefx.equals("1")){
            aux=nova_eq.substring(0, 1);
            aux=aux+"=(";
            aux=aux+nova_eq.substring(2);
            
            nova_eq=aux+")/"+coefx;
        }
        nova_eq=tiraMais(nova_eq);
        return nova_eq;
    }
    
    public String tiraMais(String equacao)
    {
        int i=0;
        String nova_eq=new String();
        
        while (i<equacao.length())
        {
            if ((equacao.charAt(i)=='+')&&(equacao.charAt(i+1)=='-'||i==0)||(equacao.charAt(i)=='=')&&(equacao.charAt(i+1)=='+'))
            {
                
            }else nova_eq=nova_eq+equacao.charAt(i);
            i++;
        }
        return nova_eq;
    }
    
    public String substituiIncognitas(String equacao,String equacao2,String incog){
        String nova_eq=new String();
        int i=0,j=2;    //j=2 porque a equacao2 vem com o formato de x=ccccccc e nao queremos o x=
        
        while(i<equacao.length()){
            
            if(equacao.charAt(i)==incog.charAt(0)){
                nova_eq=nova_eq+"(";
                while(j<equacao2.length()){
                    nova_eq=nova_eq+equacao2.charAt(j);
                    j++;
                }
                nova_eq=nova_eq+")";
            }else nova_eq=nova_eq+equacao.charAt(i);
            i++;
        }
        return nova_eq;
    }
    
    
    public String chamaParentesis(String equacao){
        int i,j, rex,posx,dif,num;       
        String aux="",variaveis="xywz",nova_eq="";
        
        i=equacao.indexOf(")")-1;
        int w=i;
        
        
        for(;equacao.charAt(i)!='(';i--);
        for(i++;i<=w;i++)
            aux=aux+equacao.charAt(i);
            System.out.println(aux);
        i=0;
        j=0;
        while(j<variaveis.length())
        { 
            rex=0;
            while(i<aux.length())
            {
                if(aux.charAt(i)==variaveis.charAt(j))
                {
                    posx=i;
                    while( i>0 && aux.charAt(i)!='-'&&aux.charAt(i)!='+')
                        i--;

                    if(aux.charAt(i)=='-')
                    {  
                        i++;
                        dif=posx-i;
                        while(aux.charAt(i)!=variaveis.charAt(j))
                        {
                            num=0;  
                            for(w=dif-1;w>0;w--)
                                num=num+(aux.charAt(i)-48)*10;
                            if(dif==1)
                                num=aux.charAt(i)-48;
                            rex=rex-num;
                            dif--; 
                            i++;
                        }
                     }
                    else
                        if(aux.charAt(i)=='+' || i==0)
                        {  
                        
                            if(i!=0)
                                i++;
                        dif=posx-i;
                            while(aux.charAt(i)!=variaveis.charAt(j))
                            {
                                num=0;  
                                for(w=dif-1;w>0;w--)
                                    num=num+(aux.charAt(i)-48)*10;
                                 if(dif==1)
                                num=aux.charAt(i)-48;
                                rex=rex+num;
                                dif--; 
                                i++;
                            }
                        }  
                }
                i++;
            }
            i=0;
            nova_eq=nova_eq+"+"+rex+variaveis.charAt(j);
            j++;        
        }
        nova_eq=tiraMais(nova_eq);
        nova_eq=tiraZeros(nova_eq);
        
        return nova_eq;
    }
    
    
    public String somaCoeficientes(String equacao){
        String nova_eq= new String();
        
        while(equacao.contains("(")){
            equacao=chamaParentesis(equacao);
        }
        nova_eq=equacao;
        return nova_eq;
    }
    public String tiraZeros(String equacao){
        int i=0;
        String nova_eq=new String();
        
        while (i<equacao.length())
        {
            if ((equacao.charAt(i)=='+'||equacao.charAt(i)=='-')&&equacao.charAt(i+1)=='0'&& equacao.charAt(i+2)>='w' && equacao.charAt(i+2)<='z')
            {
                i+=2;
            }else nova_eq=nova_eq+equacao.charAt(i);
            i++;
        }
        
        return nova_eq;
    }
    
    
    public static void main(String[] args) {
        GPS teste = new GPS();
        String teste1,teste2,teste3;
    
        teste.setString("5y+2w+98z+20x=2");
        System.out.println(teste.getString());
        teste1=teste.evidenciaIncognita(teste.getString(),"y");
        teste3= teste.substituiIncognitas("3y+4x=0", teste1, "y");
        System.out.println(teste3);
        teste2=teste.somaCoeficientes("(2x-4y-3y)");
        System.out.println(teste2);
    }
}